package com.flying.date.befor8;

import org.junit.Test;

import javax.lang.model.SourceVersion;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

/**
 * @author 刘鹏飞
 * @ClassName DateTimeDemo1
 * @Date 2024/12/21 14:58
 * @Created by 刘鹏飞
 * @Description  Java8以前日期时间API的使用
 */
public class DateTimeDemo1 {

    /*
     * Date类的使用
     *
     * |--java.util.Date
     *     >两个构造器的使用
     *     >两个方法的使用 ① toString()  ② getTime()
     *    |----  java.sql.Date: 对应数据库中的Date类型
     *
     *
     *  transient 关键字 用于修饰变量: 在需要序列化的对象中,用transient修饰不需要序列化的属性
     */
    @Test
    public void test1(){
        // 无参构造器
        Date date = new Date();
        System.out.println(date.toString());   // Sat Dec 21 15:01:34 CST 2024

        // 有参构造器:基于时间戳创建Date对象

        Date date1 = new Date(-21*365*24*60*60*1000L);  //  1date1 = Thu Jan 06 08:00:00 CST 1949
        System.out.println("date1 = " + date1);



        // getTime(): 获取时间对象对应的时间戳
        long time = date1.getTime();
        System.out.println("对应的毫秒数是"+time);


        // before()   after()
        System.out.println(date1.before(date));
        System.out.println(date.after(date1));

    }

    @Test
    public void test2(){
        java.sql.Date date1 = new java.sql.Date(-21*365*24*60*60*1000L);  //  1date1 = Thu Jan 06 08:00:00 CST 1949
        System.out.println(date1);
        System.out.println(date1.getTime());

    }

    /**
     * SimpleDateFormat: 用于日期时间的格式化,解析
     * 格式化:  日期 ---> 字符串
     * 解析:   字符串---> 日期
     */


    // 使用默认的格式化格式
    @Test
    public void test3() throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat();

        Date date = new Date();

        // 格式化:
        // 日期--> 字符串

        String strDate = sdf.format(date);
        System.out.println(strDate);  // 2024/12/21 下午3:25


        // 字符串 --> 日期
        Date date2 = sdf.parse(strDate);
        System.out.println("date2 = " + date2);



    }


    // 指定格式进行格式化
    @Test
    public void test4() throws ParseException {
        /*
        EEE：代表星期几的缩写。例如，Mon（星期一）、Tue（星期二）等
        d：代表一个月中的第几天，是 1 - 31 之间的数字
        MMM：代表月份的缩写。例如，Jan（一月）、Feb（二月）等
        yyyy：代表四位年份，如2024
        HH：代表 24 小时制的小时数，范围是 00 - 23
        mm：代表分钟数，范围是 00 - 59
        ss：代表秒数，范围是 00 - 59
         */
        // 指定格式格式化:  日期  --> 字符串
        SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
        sdf=new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss");
        Date date = new Date();

        System.out.println(sdf.format(date));  // 周六, 21 12月 2024 15:45:21 +0800


        // 解析 :字符串  --> Date对象
        Date date1 = sdf.parse("2019-11-23  8:03:25");
        System.out.println("date1 = " + date1);

        //  解析失败,因为参数的字符串不满足 SimpleDateFormat 可识别的格式
        Date date3=sdf.parse("2024/9/13 下午3:49");
        System.out.println("date3 = " + date3);

    }


    /*
     * Calendar 日历类  ---抽象类
     * ① 实例化  Calendar是一个抽象类,所以我们需要创建其子类的实例,这里我们通过静态方法getInstance()获取实例
     * ② 常用方法:  get(int field)   /  set(int field,xx)  /  add(int field,xx)  / getTime()  /setTime()
     *
     */

    @Test
    public void test5(){
        //
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar.getClass());  // class java.util.GregorianCalendar
        System.out.println(calendar.toString());

        // 测试方法
        // get(int field)
        System.out.println(calendar.get(Calendar.YEAR));  //  2024
        System.out.println(calendar.get(Calendar.MONTH));  // 11 : 月份从0开始
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
        System.out.println(calendar.get(Calendar.DAY_OF_WEEK));
        System.out.println(calendar.get(Calendar.DAY_OF_YEAR));


        // set(int field,xx)
        calendar.set(Calendar.MONTH,3);  // 将改时间测月份设置 4月份, 0,1,2,3
        System.out.println(calendar.get(Calendar.MONTH));  // 11 : 月份从0开始



        // add(int field,xx)
        calendar.add(Calendar.DAY_OF_MONTH,5);
        calendar.add(Calendar.DAY_OF_MONTH,-10);
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));


        // getTime():  Calendar --->  Date

        Date date = calendar.getTime();
        System.out.println(date);   //   Wed Sep 20 16:50:17 CST 2023


        // setTime(): 使用指定Date重置Calendar
        Date date1 = new Date(19191919999L);
        calendar.setTime(date1);
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));



    }



























}
